<?php
namespace services\models;

/**
 * 优选SKU库存同步到有试吗SKU库存表
 *
 * @author huipeng.teng@liketry.com
 */
class SyncStock extends \common\models\SyncStock {
    /**
     * 获取DB连接
     */
    public static function getDb() {
        return \Yii::$app->db;
    }

    /**
     * 获取Redis连接
     */
    public static function getRedis() {
        return \Yii::$app->redis_goods;
    }

    /**
     * 优选SKU库存数量（tmall1.product）同步到有试吗SKU库存表（d_try.product_stock）
     */
    public static function sync() {
        $flag = self::add();// 插入记录到流水表
        if($flag) {
            sleep(1);
            self::updateStock();// 从流水表获取记录并更新库存
        }
    }

    /**
     * 获取15分钟内优选SKU表更新的10000条记录，插入记录到有试吗库存更新流水表
     * @return bool true | false
     */
    private static function add() {
        // 获取15分钟内优选SKU表更新的10000条记录
        $update_time = date('Y-m-d H:i:s',  time() - 900);
        $sql = "select uid,goods_id,goods_stock from tmall1.product where update_time > '".$update_time."' limit 10000";
        $bestry_rows = self::getDb()->createCommand($sql)->queryAll();
        if(empty($bestry_rows)) {
            return false;
        }

        // 插入记录到有试吗库存更新流水表
        foreach($bestry_rows as $row) {
            $dataArray = [];
            $dataArray['goods_id'] = $row['goods_id'];
            $dataArray['product_id'] = $row['uid'];
            $dataArray['stock'] = $row['goods_stock'];
            $dataArray['create_time'] = date('Y-m-d H:i:s');
            self::getDb()->createCommand()->insert(self::tableName(), $dataArray)->execute();
        }

        return true;
    }

    /**
     * 更新有试吗库存、库存缓存、流水记录状态。
     * @return bool true | false
     */
    private static function updateStock() {
        // 获取10000条待处理的记录
        $sql = 'select * from ' . self::tableName() . ' where is_success = 0 limit 10000';
        $stock_rows = self::getDb()->createCommand($sql)->queryAll();
        if(empty($stock_rows)) {
            return false;
        }

        foreach($stock_rows as $row) {
            // 更新有试吗SKU表的库存数量
            $ret = ProductStock::updateAll(['stock' => $row['stock']], 'product_id = ' . $row['product_id']);

            if($ret > 0) {
                // 更新有试吗Redis的库存数量
                ProductStock::updateStockToRedis($row['product_id'], $row['stock']);

                // 插入solr_goods表，等待更新商品的solr索引。
                SolrGoods::add($row['goods_id']);
            }

            // 更新流水状态为执行成功
            self::updateStatus($row['sync_stock_id']);
        }

        return true;
    }

    /**
     * 更新流水记录状态为执行成功
     * @param int $sync_stock_id sync_stock表自增长ID
     * @return int
     */
    private static function updateStatus($sync_stock_id) {
        $dataArray = ['is_success' => 1, 'update_time' => date('Y-m-d H:i:s')];
        return self::getDb()->createCommand()
                ->update(self::tableName(), $dataArray, 'sync_stock_id = ' . $sync_stock_id)
                ->execute();
    }
}
